Aneuploidy prediction model based on KindEMR data from fresh IVF in autologous eggs, using age at retrieval and other factors

source("load_data.R")

library(ggtext)
library(patchwork)
kb_theme_set()

Functions from other published aneuploidy prediction models:

Franasiak et al. 2014: Percent aneuploid = 1,965 − 278.9 * Age + 16.41 * (Age)^2 − 0.4922 * (Age)^3 + 0.007451 * (Age)^4 − 0.000044692 * (Age)^5

McCoy et al. 2015 (Natera data): Log-odds aneuploid = 4.846 - 0.416 * Maternal age + 0.00755 * (Maternal age)^2


franasiak_aneuploidy <- function(age) {
  percent_value <- 1965 -
                   278.9 * age +
                   16.41 * (age^2) -
                   0.4922 * (age^3) +
                   0.007451 * (age^4) -
                   0.000044692 * (age^5)
  return(percent_value / 100) # Convert to proportion (0-1 scale)
}

natera_aneuploidy <- function(age) {
  log_odds_value <- 4.846 - 0.416 * age + 0.00755 * (age^2)
  return(exp(log_odds_value) / (1 + exp(log_odds_value))) # Convert log-odds to probability
}

Predict aneuploidy rate based on patient age at retrieval

kb %>% 
  filter(is.na(pgta_euploid) | is.na(pgta_aneuploid)) %>% view

rates_by_age <- kb %>%
  mutate(patient_age_year_at_retrieval = floor(patient_age_at_retrieval)) %>%
  filter(patient_age_year_at_retrieval %>% between(15, 50)) %>%
  filter(!is.na(pgta_aneuploid)) %>%
  group_by(patient_age_year_at_retrieval) %>%
  summarise(
    pgta_euploid_rate = mean(as.numeric(pgta_euploid), na.rm = TRUE),
    pgta_euploid_total = sum(as.numeric(pgta_euploid), na.rm = TRUE),
    pgta_aneuploid_rate = mean(as.numeric(pgta_aneuploid), na.rm = TRUE),
    pgta_aneuploid_total = sum(as.numeric(pgta_aneuploid), na.rm = TRUE),
    pgta_aneuploid_segmental_rate = mean(as.numeric(pgta_aneuploid_segmental), na.rm = TRUE),
    pgta_aneuploid_segmental_total = sum(as.numeric(pgta_aneuploid_segmental), na.rm = TRUE),
    pgta_triploid_rate = mean(as.numeric(pgta_triploid), na.rm = TRUE),
    pgta_triploid_total = sum(as.numeric(pgta_triploid), na.rm = TRUE),
    pgta_mosaic_rate = mean(as.numeric(pgta_mosaic), na.rm = TRUE),
    pgta_mosaic_total = sum(as.numeric(pgta_mosaic), na.rm = TRUE),
    pgta_mosaic_whole_chromosome_rate = mean(as.numeric(pgta_mosaic_whole_chromosome), na.rm = TRUE),
    pgta_mosaic_whole_chromosome_total = sum(as.numeric(pgta_mosaic_whole_chromosome), na.rm = TRUE),
    pgta_mosaic_segmental_rate = mean(as.numeric(pgta_mosaic_segmental), na.rm = TRUE),
    pgta_mosaic_segmental_total = sum(as.numeric(pgta_mosaic_segmental), na.rm = TRUE),
    pgta_mosaic_low_rate = mean(as.numeric(pgta_mosaic_low), na.rm = TRUE),
    pgta_mosaic_low_total = sum(as.numeric(pgta_mosaic_low), na.rm = TRUE),
    pgta_mosaic_high_rate = mean(as.numeric(pgta_mosaic_high), na.rm = TRUE),
    pgta_mosaic_high_total = sum(as.numeric(pgta_mosaic_high), na.rm = TRUE),
    pgta_no_dna_detected_rate = mean(as.numeric(pgta_no_dna_detected), na.rm = TRUE),
    pgta_no_dna_detected_total = sum(as.numeric(pgta_no_dna_detected), na.rm = TRUE),
    pgta_no_result_rate = mean(as.numeric(pgta_no_result), na.rm = TRUE),
    pgta_no_result_total = sum(as.numeric(pgta_no_result), na.rm = TRUE),
    pgta_clinical_results_undetermined_rate = mean(as.numeric(pgta_clinical_results_undetermined), na.rm = TRUE),
    pgta_clinical_results_undetermined_total = sum(as.numeric(pgta_clinical_results_undetermined), na.rm = TRUE),
    pgta_inconclusive_rate = mean(as.numeric(pgta_inconclusive), na.rm = TRUE),
    pgta_inconclusive_total = sum(as.numeric(pgta_inconclusive), na.rm = TRUE),
    n = n()
  )

# total n
rates_by_age_n <- kb %>%
  mutate(patient_age_year_at_retrieval = floor(patient_age_at_retrieval)) %>%
  filter(patient_age_year_at_retrieval %>% between(15, 50)) %>%
  filter(!is.na(pgta_aneuploid)) %>%
  summarize(
    n = n(),
    distinct_attempts = n_distinct(attempt_id),
    distinct_patients = n_distinct(patient_id)
  )

No apparent effect of biopsy day or patient age on no call rate

LS0tCnRpdGxlOiAnS2luZExhYnMgTW9kZWw6IEtpbmRFTVIgRGF0YSBPbmx5JwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KCkFuZXVwbG9pZHkgcHJlZGljdGlvbiBtb2RlbCBiYXNlZCBvbiBLaW5kRU1SIGRhdGEgZnJvbSBmcmVzaCBJVkYgaW4gYXV0b2xvZ291cyBlZ2dzLCB1c2luZyBhZ2UgYXQgcmV0cmlldmFsIGFuZCBvdGhlciBmYWN0b3JzCgpgYGB7cn0Kc291cmNlKCJsb2FkX2RhdGEuUiIpCgpsaWJyYXJ5KGdndGV4dCkKbGlicmFyeShwYXRjaHdvcmspCmtiX3RoZW1lX3NldCgpCmBgYAoKRnVuY3Rpb25zIGZyb20gb3RoZXIgcHVibGlzaGVkIGFuZXVwbG9pZHkgcHJlZGljdGlvbiBtb2RlbHM6CgpGcmFuYXNpYWsgZXQgYWwuIDIwMTQ6IFBlcmNlbnQgYW5ldXBsb2lkID0gMSw5NjUg4oiSIDI3OC45IFwqIEFnZSArIDE2LjQxIFwqIChBZ2UpXF4yIOKIkiAwLjQ5MjIgXCogKEFnZSlcXjMgKyAwLjAwNzQ1MSBcKiAoQWdlKVxeNCDiiJIgMC4wMDAwNDQ2OTIgXCogKEFnZSlcXjUKCk1jQ295IGV0IGFsLiAyMDE1IChOYXRlcmEgZGF0YSk6IExvZy1vZGRzIGFuZXVwbG9pZCA9IDQuODQ2IC0gMC40MTYgXCogTWF0ZXJuYWwgYWdlICsgMC4wMDc1NSBcKiAoTWF0ZXJuYWwgYWdlKVxeMgoKYGBge3J9CgpmcmFuYXNpYWtfYW5ldXBsb2lkeSA8LSBmdW5jdGlvbihhZ2UpIHsKICBwZXJjZW50X3ZhbHVlIDwtIDE5NjUgLQogICAgICAgICAgICAgICAgICAgMjc4LjkgKiBhZ2UgKwogICAgICAgICAgICAgICAgICAgMTYuNDEgKiAoYWdlXjIpIC0KICAgICAgICAgICAgICAgICAgIDAuNDkyMiAqIChhZ2VeMykgKwogICAgICAgICAgICAgICAgICAgMC4wMDc0NTEgKiAoYWdlXjQpIC0KICAgICAgICAgICAgICAgICAgIDAuMDAwMDQ0NjkyICogKGFnZV41KQogIHJldHVybihwZXJjZW50X3ZhbHVlIC8gMTAwKSAjIENvbnZlcnQgdG8gcHJvcG9ydGlvbiAoMC0xIHNjYWxlKQp9CgpuYXRlcmFfYW5ldXBsb2lkeSA8LSBmdW5jdGlvbihhZ2UpIHsKICBsb2dfb2Rkc192YWx1ZSA8LSA0Ljg0NiAtIDAuNDE2ICogYWdlICsgMC4wMDc1NSAqIChhZ2VeMikKICByZXR1cm4oZXhwKGxvZ19vZGRzX3ZhbHVlKSAvICgxICsgZXhwKGxvZ19vZGRzX3ZhbHVlKSkpICMgQ29udmVydCBsb2ctb2RkcyB0byBwcm9iYWJpbGl0eQp9CgpgYGAKClByZWRpY3QgYW5ldXBsb2lkeSByYXRlIGJhc2VkIG9uIHBhdGllbnQgYWdlIGF0IHJldHJpZXZhbAoKYGBge3J9CmtiICU+JSAKICBmaWx0ZXIoaXMubmEocGd0YV9ldXBsb2lkKSB8IGlzLm5hKHBndGFfYW5ldXBsb2lkKSkgJT4lIHZpZXcKCnJhdGVzX2J5X2FnZSA8LSBrYiAlPiUKICBtdXRhdGUocGF0aWVudF9hZ2VfeWVhcl9hdF9yZXRyaWV2YWwgPSBmbG9vcihwYXRpZW50X2FnZV9hdF9yZXRyaWV2YWwpKSAlPiUKICBmaWx0ZXIocGF0aWVudF9hZ2VfeWVhcl9hdF9yZXRyaWV2YWwgJT4lIGJldHdlZW4oMTUsIDUwKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShwZ3RhX2FuZXVwbG9pZCkpICU+JQogIGdyb3VwX2J5KHBhdGllbnRfYWdlX3llYXJfYXRfcmV0cmlldmFsKSAlPiUKICBzdW1tYXJpc2UoCiAgICBwZ3RhX2V1cGxvaWRfcmF0ZSA9IG1lYW4oYXMubnVtZXJpYyhwZ3RhX2V1cGxvaWQpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9ldXBsb2lkX3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9ldXBsb2lkKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfYW5ldXBsb2lkX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV9hbmV1cGxvaWQpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9hbmV1cGxvaWRfdG90YWwgPSBzdW0oYXMubnVtZXJpYyhwZ3RhX2FuZXVwbG9pZCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX2FuZXVwbG9pZF9zZWdtZW50YWxfcmF0ZSA9IG1lYW4oYXMubnVtZXJpYyhwZ3RhX2FuZXVwbG9pZF9zZWdtZW50YWwpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9hbmV1cGxvaWRfc2VnbWVudGFsX3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9hbmV1cGxvaWRfc2VnbWVudGFsKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfdHJpcGxvaWRfcmF0ZSA9IG1lYW4oYXMubnVtZXJpYyhwZ3RhX3RyaXBsb2lkKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfdHJpcGxvaWRfdG90YWwgPSBzdW0oYXMubnVtZXJpYyhwZ3RhX3RyaXBsb2lkKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbW9zYWljX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV9tb3NhaWMpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9tb3NhaWNfdG90YWwgPSBzdW0oYXMubnVtZXJpYyhwZ3RhX21vc2FpYyksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX21vc2FpY193aG9sZV9jaHJvbW9zb21lX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV9tb3NhaWNfd2hvbGVfY2hyb21vc29tZSksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX21vc2FpY193aG9sZV9jaHJvbW9zb21lX3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9tb3NhaWNfd2hvbGVfY2hyb21vc29tZSksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX21vc2FpY19zZWdtZW50YWxfcmF0ZSA9IG1lYW4oYXMubnVtZXJpYyhwZ3RhX21vc2FpY19zZWdtZW50YWwpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9tb3NhaWNfc2VnbWVudGFsX3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9tb3NhaWNfc2VnbWVudGFsKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbW9zYWljX2xvd19yYXRlID0gbWVhbihhcy5udW1lcmljKHBndGFfbW9zYWljX2xvdyksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX21vc2FpY19sb3dfdG90YWwgPSBzdW0oYXMubnVtZXJpYyhwZ3RhX21vc2FpY19sb3cpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9tb3NhaWNfaGlnaF9yYXRlID0gbWVhbihhcy5udW1lcmljKHBndGFfbW9zYWljX2hpZ2gpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9tb3NhaWNfaGlnaF90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfbW9zYWljX2hpZ2gpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9ub19kbmFfZGV0ZWN0ZWRfcmF0ZSA9IG1lYW4oYXMubnVtZXJpYyhwZ3RhX25vX2RuYV9kZXRlY3RlZCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX25vX2RuYV9kZXRlY3RlZF90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfbm9fZG5hX2RldGVjdGVkKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbm9fcmVzdWx0X3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV9ub19yZXN1bHQpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9ub19yZXN1bHRfdG90YWwgPSBzdW0oYXMubnVtZXJpYyhwZ3RhX25vX3Jlc3VsdCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX2NsaW5pY2FsX3Jlc3VsdHNfdW5kZXRlcm1pbmVkX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV9jbGluaWNhbF9yZXN1bHRzX3VuZGV0ZXJtaW5lZCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX2NsaW5pY2FsX3Jlc3VsdHNfdW5kZXRlcm1pbmVkX3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9jbGluaWNhbF9yZXN1bHRzX3VuZGV0ZXJtaW5lZCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX2luY29uY2x1c2l2ZV9yYXRlID0gbWVhbihhcy5udW1lcmljKHBndGFfaW5jb25jbHVzaXZlKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfaW5jb25jbHVzaXZlX3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9pbmNvbmNsdXNpdmUpLCBuYS5ybSA9IFRSVUUpLAogICAgbiA9IG4oKQogICkKCiMgdG90YWwgbgpyYXRlc19ieV9hZ2VfbiA8LSBrYiAlPiUKICBtdXRhdGUocGF0aWVudF9hZ2VfeWVhcl9hdF9yZXRyaWV2YWwgPSBmbG9vcihwYXRpZW50X2FnZV9hdF9yZXRyaWV2YWwpKSAlPiUKICBmaWx0ZXIocGF0aWVudF9hZ2VfeWVhcl9hdF9yZXRyaWV2YWwgJT4lIGJldHdlZW4oMTUsIDUwKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShwZ3RhX2FuZXVwbG9pZCkpICU+JQogIHN1bW1hcml6ZSgKICAgIG4gPSBuKCksCiAgICBkaXN0aW5jdF9hdHRlbXB0cyA9IG5fZGlzdGluY3QoYXR0ZW1wdF9pZCksCiAgICBkaXN0aW5jdF9wYXRpZW50cyA9IG5fZGlzdGluY3QocGF0aWVudF9pZCkKICApCgpgYGAKCmBgYHtyfQpnMSA8LSByYXRlc19ieV9hZ2UgJT4lIAogIGdncGxvdChhZXMoeCA9IHBhdGllbnRfYWdlX3llYXJfYXRfcmV0cmlldmFsLCB5ID0gcGd0YV9hbmV1cGxvaWRfcmF0ZSkpICsKICBnZW9tX3Ntb290aCAoCiAgICBtZXRob2QgPSAiZ2xtIiwKICAgIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAiYmlub21pYWwiKSwKICAgICMgNXRoIG9yZGVyIHBvbHlub21pYWwgZml0CiAgICBmb3JtdWxhID0geSB+IHBvbHkoeCwgNSwgcmF3ID0gVFJVRSksICMgcmF3ID0gVFJVRSBmb3IgcG9seW5vbWlhbCBmaXQKICAgIGFlcyh3ZWlnaHQgPSBuKSwKICAgIHNlID0gVFJVRSwKICAgIGxldmVsID0gMC45NSwKICAgIGNvbG9yID0gIiNGOUUxNjgiLAogICAgZmlsbCA9ICIjRjNFN0RBIgogICkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjYsIGNvbG9yID0gIiMzNTMxNDgiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpICsKICBsYWJzKAogICAgdGl0bGUgPSAiS2luZExhYnMgQW5ldXBsb2lkeSBSYXRlIGJ5IEFnZSIsCiAgICBzdWJ0aXRsZSA9ICJGcmVzaCBhdXRvbG9nb3VzIElWRiBjeWNsZXMgaW4gS2luZEVNUiwgQXByaWwgMjAyMyB0byBKdWx5IDIwMjUiLAogICAgeCA9ICJQYXRpZW50IEFnZSBhdCBSZXRyaWV2YWwgKHllYXJzKSIsCiAgICB5ID0gIiIsCiAgICBjYXB0aW9uID0gZ2x1ZTo6Z2x1ZShyYXRlc19ieV9hZ2VfbiRuLCAiIHRyb3BoZWN0b2Rlcm0gYmlvcHNpZXMsICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZXNfYnlfYWdlX24kZGlzdGluY3RfYXR0ZW1wdHMsICIgZnJlc2ggYXV0b2xvZ291cyBJVkYgY3ljbGVzLCAiLAogICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZXNfYnlfYWdlX24kZGlzdGluY3RfcGF0aWVudHMsICIgcGF0aWVudHMiKSkKCmFkZF9rYl9sb2dvKGcxKQpgYGAKCmBgYHtyfQpnMV9uIDwtIHJhdGVzX2J5X2FnZSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcGF0aWVudF9hZ2VfeWVhcl9hdF9yZXRyaWV2YWwsIHkgPSBwZ3RhX2FuZXVwbG9pZF9yYXRlKSkgKwogIGdlb21fc21vb3RoICgKICAgIG1ldGhvZCA9ICJnbG0iLAogICAgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICJiaW5vbWlhbCIpLAogICAgIyA1dGggb3JkZXIgcG9seW5vbWlhbCBmaXQKICAgIGZvcm11bGEgPSB5IH4gcG9seSh4LCA1LCByYXcgPSBUUlVFKSwgIyByYXcgPSBUUlVFIGZvciBwb2x5bm9taWFsIGZpdAogICAgYWVzKHdlaWdodCA9IG4pLAogICAgc2UgPSBUUlVFLAogICAgbGV2ZWwgPSAwLjk1LAogICAgY29sb3IgPSAiI0Y5RTE2OCIsCiAgICBmaWxsID0gIiNGM0U3REEiCiAgKSArCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IG4pLCBhbHBoYSA9IDAuNiwgY29sb3IgPSAiIzM1MzE0OCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCBicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJLaW5kTGFicyBBbmV1cGxvaWR5IFJhdGUgYnkgQWdlIiwKICAgIHN1YnRpdGxlID0gIkZyZXNoIGF1dG9sb2dvdXMgSVZGIGN5Y2xlcyBpbiBLaW5kRU1SLCBBcHJpbCAyMDIzIHRvIEp1bHkgMjAyNSIsCiAgICB4ID0gIlBhdGllbnQgQWdlIGF0IFJldHJpZXZhbCAoeWVhcnMpIiwKICAgIHkgPSAiIiwKICAgIHNpemUgPSAiQmlvcHNpZXMiLAogICAgY2FwdGlvbiA9IGdsdWU6OmdsdWUocmF0ZXNfYnlfYWdlX24kbiwgIiB0cm9waGVjdG9kZXJtIGJpb3BzaWVzLCAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGVzX2J5X2FnZV9uJGRpc3RpbmN0X2F0dGVtcHRzLCAiIGZyZXNoIGF1dG9sb2dvdXMgSVZGIGN5Y2xlcywgIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGVzX2J5X2FnZV9uJGRpc3RpbmN0X3BhdGllbnRzLCAiIHBhdGllbnRzIikpCgogIAojIChnMSArIGFubm90YXRlKAojICAgICAidGV4dCIsCiMgICAgIHggPSA0MCwKIyAgICAgeSA9IDAuNSwKIyAgICAgbGFiZWwgPSAiMm5kIGRlZ3JlZSBwb2x5bm9taWFsIGZpdCIsCiMgICAgIGNvbG9yID0gImRhcmtnb2xkZW5yb2QiLAojICAgICBzaXplID0gMywKIyAgICAgaGp1c3QgPSAwCiMgICApICkKCmFkZF9rYl9sb2dvKGcxX24pCmBgYAoKYGBge3J9CmcxX2JhZF9wb2x5bm9taWFsIDwtIHJhdGVzX2J5X2FnZSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcGF0aWVudF9hZ2VfeWVhcl9hdF9yZXRyaWV2YWwsIHkgPSBwZ3RhX2FuZXVwbG9pZF9yYXRlKSkgKwogIGdlb21fc21vb3RoICgKICAgIG1ldGhvZCA9ICJsbSIsCiAgICAjIDV0aCBvcmRlciBwb2x5bm9taWFsIGZpdAogICAgZm9ybXVsYSA9IHkgfiBwb2x5KHgsIDUsIHJhdyA9IFRSVUUpLCAjIHJhdyA9IFRSVUUgZm9yIHBvbHlub21pYWwgZml0CiAgICBhZXMod2VpZ2h0ID0gbiksCiAgICBzZSA9IFRSVUUsCiAgICBsZXZlbCA9IDAuOTUsCiAgICBjb2xvciA9ICIjRjlFMTY4IiwKICAgIGZpbGwgPSAiI0YzRTdEQSIKICApICsKICBnZW9tX3BvaW50KGFscGhhID0gMC42LCBjb2xvciA9ICIjMzUzMTQ4IikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIGJyZWFrcyA9IHNjYWxlczo6cHJldHR5X2JyZWFrcygpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNjYWxlczo6cHJldHR5X2JyZWFrcygpKSArCiAgbGFicygKICAgIHRpdGxlID0gIktpbmRMYWJzIEFuZXVwbG9pZHkgUmF0ZSBieSBBZ2UiLAogICAgc3VidGl0bGUgPSAiRnJlc2ggYXV0b2xvZ291cyBJVkYgY3ljbGVzIGluIEtpbmRFTVIsIEFwcmlsIDIwMjMgdG8gSnVseSAyMDI1IiwKICAgIHggPSAiUGF0aWVudCBBZ2UgYXQgUmV0cmlldmFsICh5ZWFycykiLAogICAgeSA9ICIiKSArCiAgYW5ub3RhdGUoCiAgICAidGV4dCIsCiAgICB4ID0gNDIsIAogICAgeSA9IDAuNSwgCiAgICBsYWJlbCA9ICJMaW5lYXIgcmVncmVzc2lvblxuNXRoLW9yZGVyIHBvbHlub21pYWwgZml0IiwKICAgIGNvbG9yID0gImRhcmtnb2xkZW5yb2QiLAogICAgc2l6ZSA9IDMKICApCgphZGRfa2JfbG9nbyhnMV9iYWRfcG9seW5vbWlhbCkKYGBgCmBgYHtyfQojIGZ1bmN0aW9uIHRvIGZpdCBwb2x5bm9taWFsIG9mIG4gZGVncmVlIGFuZCBtYWtlIHNhbWUgZ3JhcGggYWJvdmUKZml0X3BvbHlub21pYWwgPC0gZnVuY3Rpb24oZGF0YSwgZGVncmVlID0gNSwgY2FwdGlvbl90ZXh0ID0gIjV0aCBkZWdyZWUgcG9seW5vbWlhbCIpIHsKICBkYXRhICU+JQogICAgZ2dwbG90KGFlcyh4ID0gcGF0aWVudF9hZ2VfeWVhcl9hdF9yZXRyaWV2YWwsIHkgPSBwZ3RhX2FuZXVwbG9pZF9yYXRlKSkgKwogICAgZ2VvbV9zbW9vdGgoCiAgICAgIG1ldGhvZCA9ICJsbSIsCiAgICAgIGZvcm11bGEgPSB5IH4gcG9seSh4LCBkZWdyZWUsIHJhdyA9IFRSVUUpLAogICAgICBzZSA9IEZBTFNFLAogICAgICBjb2xvciA9ICIjRjlFMTY4IgogICAgKSArCiAgICBnZW9tX3BvaW50KGFscGhhID0gMC42LCBjb2xvciA9ICIjMzUzMTQ4IikgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpICsKICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkgKwogICAgbGFicygKICAgICAgeCA9ICIiLAogICAgICB5ID0gIiIsCiAgICAgIHN1YnRpdGxlID0gY2FwdGlvbl90ZXh0CiAgICApCn0KYGBgCgpgYGB7cn0KIyA1IGdncGxvdHMgdG9nZXRoZXIgZm9yIGVhY2ggcG9seW5vbWlhbCBvcmRlciBmcm9tIDEgdG8gNQpjb21iaW5lZF9wb2x5bm9taWFsX3Bsb3RzIDwtIHBhdGNod29yazo6d3JhcF9wbG90cygKICBmaXRfcG9seW5vbWlhbChyYXRlc19ieV9hZ2UsMSwgIjFzdCBkZWdyZWUgcG9seW5vbWlhbCAobGluZSkiKSwKICBmaXRfcG9seW5vbWlhbChyYXRlc19ieV9hZ2UsMiwgIjJuZCBkZWdyZWUgcG9seW5vbWlhbCAocGFyYWJvbGEpIiksCiAgZml0X3BvbHlub21pYWwocmF0ZXNfYnlfYWdlLDMsICIzcmQgZGVncmVlIHBvbHlub21pYWwgKGN1YmljKSIpLAogIGZpdF9wb2x5bm9taWFsKHJhdGVzX2J5X2FnZSw0LCAiNHRoIGRlZ3JlZSBwb2x5bm9taWFsIiksCiAgZml0X3BvbHlub21pYWwocmF0ZXNfYnlfYWdlLDUsICI1dGggZGVncmVlIHBvbHlub21pYWwiKQogICkgKyAKICAjIHBsb3RfbGF5b3V0KG5jb2wgPSAzKSArCiAgcGxvdF9hbm5vdGF0aW9uKAogICAgbGFicygKICAgICAgc3VidGl0bGUgPSAiS2luZExhYnMgQW5ldXBsb2lkeSBSYXRlIGJ5IEFnZSB3aXRoIFBvbHlub21pYWwgRml0cyBvZiBWYXJ5aW5nIERlZ3JlZSIsCiAgICApCiAgKQojIGdnc2F2ZSgiZmlndXJlcy9jb21iaW5lZF9wb2x5bm9taWFsX3Bsb3RzLnBuZyIsIGNvbWJpbmVkX3BvbHlub21pYWxfcGxvdHMsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNCwgZHBpID0gMzAwKSAgCiNnZ3NhdmUgdG8gY2xpcGJvYXJkCmNvbWJpbmVkX3BvbHlub21pYWxfcGxvdHMKCgoKYGBgCgpgYGB7cn0KZzFfc3BsaW5lcyA8LSByYXRlc19ieV9hZ2UgJT4lIAogIGdncGxvdChhZXMoeCA9IHBhdGllbnRfYWdlX3llYXJfYXRfcmV0cmlldmFsLCB5ID0gcGd0YV9hbmV1cGxvaWRfcmF0ZSkpICsKICAjIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iLCBtZXRob2QuYXJncz1saXN0KGZhbWlseT0iYmlub21pYWwiLCBmb3JtdWxhID0gY2JpbmQoc2UgPSBUUlVFLCBsZXZlbCA9IDAuOTUsIGNvbG9yID0gIiNGOUUxNjgiLCBmaWxsID0gIiNGM0U3REEiKSArCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIGdlb21fc21vb3RoICgKICAgIG1ldGhvZCA9ICJnbG0iLAogICAgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICJiaW5vbWlhbCIpLAogICAgZm9ybXVsYSA9IHkgfiBzcGxpbmVzOjpucyh4LCA4KSwgIyA1IGtub3RzCiAgICBhZXMod2VpZ2h0ID0gbiksCiAgICBzZSA9IFRSVUUsCiAgICBsZXZlbCA9IDAuOTUsCiAgICBjb2xvciA9ICIjRjlFMTY4IiwKICAgIGZpbGwgPSAiI0YzRTdEQSIKICApICsKICBhbm5vdGF0ZSgKICAgICJ0ZXh0IiwKICAgIHggPSA0MCwgCiAgICB5ID0gLjUsIAogICAgbGFiZWwgPSAibG9naXN0aWMgcmVncmVzc2lvbiB3L1xuY3ViaWMgc3BsaW5lcyBmaXQsIDUga25vdHMiLAogICAgY29sb3IgPSAiZGFya2dvbGRlbnJvZCIsCiAgICBzaXplID0gMywKICAgIGhqdXN0ID0gMAogICkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjYsIGNvbG9yID0gIiMzNTMxNDgiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpICsKICBsYWJzKAogICAgdGl0bGUgPSAiS2luZExhYnMgQW5ldXBsb2lkeSBSYXRlIGJ5IEFnZSIsCiAgICBzdWJ0aXRsZSA9ICJGcmVzaCBhdXRvbG9nb3VzIElWRiBjeWNsZXMgaW4gS2luZEVNUiwgQXByaWwgMjAyMyB0byBKdWx5IDIwMjUiLAogICAgeCA9ICJQYXRpZW50IEFnZSBhdCBSZXRyaWV2YWwgKHllYXJzKSIsCiAgICB5ID0gIiIpCiAKZzFfc3BsaW5lcyA8LSBnMV9zcGxpbmVzICsgbGFicyhjYXB0aW9uID0gZ2x1ZTo6Z2x1ZShyYXRlc19ieV9hZ2VfbiRuLCAiIHRyb3BoZWN0b2Rlcm0gYmlvcHNpZXMsICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZXNfYnlfYWdlX24kZGlzdGluY3RfYXR0ZW1wdHMsICIgZnJlc2ggYXV0b2xvZ291cyBJVkYgY3ljbGVzLCAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZXNfYnlfYWdlX24kZGlzdGluY3RfcGF0aWVudHMsICIgcGF0aWVudHMiKSkKCmFkZF9rYl9sb2dvKGcxX3NwbGluZXMpCmBgYAoKYGBge3J9CmcyIDwtIGcxICsKICBzdGF0X2Z1bmN0aW9uKAogICAgZnVuID0gZnJhbmFzaWFrX2FuZXVwbG9pZHksIAogICAgY29sb3IgPSAicmVkIiwgCiAgICBsaW5ld2lkdGggPSAxICAjICdzaXplJyBpcyBhbiBvbGRlciBhcmd1bWVudCwgJ2xpbmV3aWR0aCcgaXMgcHJlZmVycmVkIGZvciBsaW5lcwogICkgKwogIGFubm90YXRlKAogICAgICAidGV4dCIsCiAgICAgIHggPSAyNSwgCiAgICAgIHkgPSAwLjUsIAogICAgICBsYWJlbCA9ICJGcmFuYXNpYWsgZXQgYWwuIDIwMTRcbnBvbHlub21pYWwgZml0IiwKICAgICAgY29sb3IgPSAicmVkIiwKICAgICAgc2l6ZSA9IDMKICApICsKICBsYWJzKAogICAgdGl0bGUgPSAiS2luZExhYnMgQW5ldXBsb2lkeSBSYXRlIGJ5IEFnZSIsCiAgICBzdWJ0aXRsZSA9ICJGcmVzaCBhdXRvbG9nb3VzIElWRiBjeWNsZXMgaW4gS2luZEVNUiwgQXByaWwgMjAyMyB0byBKdWx5IDIwMjUiLAogICAgeCA9ICJQYXRpZW50IEFnZSBhdCBSZXRyaWV2YWwgKHllYXJzKSIsCiAgICB5ID0gIiIKICAgICkgKwogIGFubm90YXRlKAogICAgInRleHQiLAogICAgeCA9IDQwLAogICAgeSA9IDAuNSwKICAgIGxhYmVsID0gIkxvZ2lzdGljIHJlZ3Jlc3Npb25cbjV0aCBkZWdyZWUgcG9seW5vbWlhbCBmaXQiLAogICAgY29sb3IgPSAiZGFya2dvbGRlbnJvZCIsCiAgICBzaXplID0gMywKICAgIGhqdXN0ID0gMAogICkKICAKCmFkZF9rYl9sb2dvKGcyKQpgYGAKYGBge3J9CmczIDwtIHJhdGVzX2J5X2FnZSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcGF0aWVudF9hZ2VfeWVhcl9hdF9yZXRyaWV2YWwsIHkgPSBwZ3RhX2FuZXVwbG9pZF9yYXRlKSkgKwogIGdlb21fc21vb3RoICgKICAgIG1ldGhvZCA9ICJnbG0iLAogICAgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICJiaW5vbWlhbCIpLAogICAgIyAybmQgb3JkZXIgcG9seW5vbWlhbCBmaXQKICAgIGZvcm11bGEgPSB5IH4gcG9seSh4LCAyLCByYXcgPSBUUlVFKSwgIyByYXcgPSBUUlVFIGZvciBwb2x5bm9taWFsIGZpdAogICAgYWVzKHdlaWdodCA9IG4pLAogICAgc2UgPSBUUlVFLAogICAgbGV2ZWwgPSAwLjk1LAogICAgY29sb3IgPSAiI0Y5RTE2OCIsCiAgICBmaWxsID0gIiNGM0U3REEiCiAgKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNiwgY29sb3IgPSAiIzM1MzE0OCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCBicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJLaW5kTGFicyBBbmV1cGxvaWR5IFJhdGUgYnkgQWdlIiwKICAgIHN1YnRpdGxlID0gIkZyZXNoIGF1dG9sb2dvdXMgSVZGIGN5Y2xlcyBpbiBLaW5kRU1SLCBBcHJpbCAyMDIzIHRvIEp1bHkgMjAyNSIsCiAgICB4ID0gIlBhdGllbnQgQWdlIGF0IFJldHJpZXZhbCAoeWVhcnMpIiwKICAgIHkgPSAiIiwKICAgIGNhcHRpb24gPSBnbHVlOjpnbHVlKHJhdGVzX2J5X2FnZV9uJG4sICIgdHJvcGhlY3RvZGVybSBiaW9wc2llcywgIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICByYXRlc19ieV9hZ2VfbiRkaXN0aW5jdF9hdHRlbXB0cywgIiBmcmVzaCBhdXRvbG9nb3VzIElWRiBjeWNsZXMsICIsCiAgICAgICAgICAgICAgICAgICAgICAgICByYXRlc19ieV9hZ2VfbiRkaXN0aW5jdF9wYXRpZW50cywgIiBwYXRpZW50cyIpKSArCiAgc3RhdF9mdW5jdGlvbigKICAgIGZ1biA9IG5hdGVyYV9hbmV1cGxvaWR5LAogICAgY29sb3IgPSAicmVkIiwgCiAgICBsaW5ld2lkdGggPSAxCiAgKSArCiAgYW5ub3RhdGUoCiAgICAgICJ0ZXh0IiwKICAgICAgeCA9IDI1LCAKICAgICAgeSA9IDAuNSwgCiAgICAgIGxhYmVsID0gIk1jQ295IGV0IGFsLiAyMDE1XG4oTmF0ZXJhIGRhdGEpXG5wb2x5bm9taWFsIGZpdCIsCiAgICAgIGNvbG9yID0gInJlZCIsCiAgICAgIHNpemUgPSAzCiAgKSArCiAgYW5ub3RhdGUoCiAgICAidGV4dCIsCiAgICB4ID0gNDAsCiAgICB5ID0gMC41LAogICAgbGFiZWwgPSAiTG9naXN0aWMgcmVncmVzc2lvblxuMm5kIGRlZ3JlZSBwb2x5bm9taWFsIGZpdCIsCiAgICBjb2xvciA9ICJkYXJrZ29sZGVucm9kIiwKICAgIHNpemUgPSAzLAogICAgaGp1c3QgPSAwCiAgKQogIAoKYWRkX2tiX2xvZ28oZzMpCgpgYGAKCmBgYHtyfQojIGJhciBncmFwaCB3aXRoIGNvdW50IG9mIGVtYnJ5b3MgYnkgYWdlCnJhdGVzX2J5X2FnZSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcGF0aWVudF9hZ2VfeWVhcl9hdF9yZXRyaWV2YWwsIHkgPSBuKSkgKwogIGdlb21fY29sKGZpbGwgPSAiI0Y5RTE2OCIsIGFscGhhID0gMC42KSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLCB2anVzdCA9IC0wLjUsIHNpemUgPSAzLjUsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJUb3RhbCBFbWJyeW9zIEJpb3BzaWVkIGJ5IEFnZSIsCiAgICBzdWJ0aXRsZSA9ICJGcmVzaCBhdXRvbG9nb3VzIElWRiBjeWNsZXMgaW4gS2luZEVNUiwgQXByaWwgMjAyMyB0byBKdWx5IDIwMjUiLAogICAgeCA9ICJQYXRpZW50IEFnZSBhdCBSZXRyaWV2YWwgKHllYXJzKSIsCiAgICB5ID0gIkNvdW50IG9mIEVtYnJ5b3MiCiAgKQpgYGAKCmBgYHtyfQojIFRoZSBzZWNvbmRhcnkgYXhpcyBsYWJlbHMgd2lsbCB0aGVuIHJldmVyc2UgdGhpcyB0cmFuc2Zvcm1hdGlvbi4KbWF4X25fdmFsdWUgPC0gbWF4KHJhdGVzX2J5X2FnZSRuLCBuYS5ybSA9IFRSVUUpCgojIENyZWF0ZSB0aGUgY29tYmluZWQgcGxvdApjb21iaW5lZF9wbG90IDwtIGcxX3NwbGluZXMgKwogIGdlb21fY29sKGFlcyh5ID0gbiAvIG1heF9uX3ZhbHVlLCBmaWxsID0gIkNvdW50IG9mIEVtYnJ5b3MiKSwgYWxwaGEgPSAwLjYpICsKCiAgIyBEZWZpbmUgc2NhbGVzCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgbmFtZSA9ICJQYXRpZW50IEFnZSBhdCBSZXRyaWV2YWwgKHllYXJzKSIsCiAgICBicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MobiA9IDUpICMgQWRqdXN0IG4gZm9yIGRlc2lyZWQgbnVtYmVyIG9mIGJyZWFrcwogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIG5hbWUgPSAiUEdULUEgQW5ldXBsb2lkeSBSYXRlIiwKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwKICAgIGJyZWFrcyA9IHNjYWxlczo6cHJldHR5X2JyZWFrcygpLCAKICAgIGxpbWl0cyA9IGMoMCwxKSwKICAgIAogICAgIyBTZWNvbmRhcnkgWS1heGlzIGZvciBDb3VudCBvZiBFbWJyeW9zCiAgICBzZWMuYXhpcyA9IHNlY19heGlzKAogICAgICB0cmFucyA9IH4gLiAqIG1heF9uX3ZhbHVlLCAjIEludmVyc2UgdHJhbnNmb3JtYXRpb24gdG8gZ2V0IG9yaWdpbmFsICduJyB2YWx1ZXMKICAgICAgbmFtZSA9ICJUb3RhbCBFbWJyeW9zIEJpb3BzaWVkIiwKICAgICAgYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKG4gPSA1KQogICAgKQogICkgKwoKICAjIE1hbnVhbCBjb2xvciBhbmQgZmlsbCBzY2FsZXMgZm9yIGxlZ2VuZCBhbmQgYXBwZWFyYW5jZQogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgdmFsdWVzID0gYygKICAgICAgIkNvdW50IG9mIEVtYnJ5b3MiID0gIiMzNTMxNDgiLCAgICAgICAgIyBGaWxsIGZvciBnZW9tX2NvbAogICAgICAiQW5ldXBsb2lkeSBSYXRlIChTRSkiID0gIiNGM0U3REEiICAgICAjIEZpbGwgZm9yIGdlb21fc21vb3RoIFNFIGJhbmQKICAgICkKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKAogICAgICAiQW5ldXBsb2lkeSBSYXRlIChUcmVuZCkiID0gIiNGOUUxNjgiLCAjIENvbG9yIGZvciBnZW9tX3Ntb290aCBsaW5lCiAgICAgICJBbmV1cGxvaWR5IFJhdGUgKFBvaW50cykiID0gIiMzNTMxNDgiICMgQ29sb3IgZm9yIGdlb21fcG9pbnQKICAgICksCiAgICAjIEVuc3VyZSBwb2ludHMgYXJlIHZpc2libGUgaW4gdGhlIGxlZ2VuZCBpZiBhIGxpbmUgaXMgYWxzbyBwcmVzZW50CiAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KAogICAgICBsaW5ldHlwZSA9IGMoInNvbGlkIiwgImJsYW5rIiksICMgTGluZSBmb3IgdHJlbmQsIG5vIGxpbmUgZm9yIHBvaW50cwogICAgICBzaGFwZSA9IGMoTkEsIDE2KSAgICAgICAgICAgICAgICMgTm8gc2hhcGUgZm9yIHRyZW5kLCBwb2ludCBzaGFwZSBmb3IgcG9pbnRzCiAgICApKQogICkgKwoKICAjIExhYmVscyBhbmQgVGl0bGUKICBsYWJzKAogICAgdGl0bGUgPSAiQW5ldXBsb2lkeSBSYXRlIGFuZCBFbWJyeW8gQ291bnQgYnkgUGF0aWVudCBBZ2UiLAogICAgc3VidGl0bGUgPSAiRnJlc2ggYXV0b2xvZ291cyBJVkYgY3ljbGVzLCBLaW5kRU1SLCBBcHJpbCAyMDIzIC0gSnVseSAyMDI1IiwKICAgIHggPSAiUGF0aWVudCBBZ2UgYXQgUmV0cmlldmFsICh5ZWFycykiCiAgICAjIFktYXhpcyBsYWJlbHMgYXJlIHNldCBpbiBzY2FsZV95X2NvbnRpbnVvdXMgYW5kIHNlY19heGlzCiAgKSArCiAgCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgKQoKIyBQcmludCB0aGUgcGxvdAphZGRfa2JfbG9nbyhjb21iaW5lZF9wbG90KQpgYGAKCmBgYHtyfQpyYXRlc19ieV9ieF9kYXkgPC0ga2IgJT4lCiAgbXV0YXRlKHBhdGllbnRfYWdlX3llYXJfYXRfcmV0cmlldmFsID0gZmxvb3IocGF0aWVudF9hZ2VfYXRfcmV0cmlldmFsKSwKICAgICAgICAgYnhfZGF5ID0gZmFjdG9yKGJ4X2RheSkpICU+JQogIGZpbHRlcihwYXRpZW50X2FnZV95ZWFyX2F0X3JldHJpZXZhbCAlPiUgYmV0d2VlbigxNSwgNTApKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBndGFfYW5ldXBsb2lkKSwgIWlzLm5hKGJ4X2RheSkpICU+JQogIGdyb3VwX2J5KGJ4X2RheSxwYXRpZW50X2FnZV95ZWFyX2F0X3JldHJpZXZhbCkgJT4lCiAgc3VtbWFyaXNlKAogICAgcGd0YV9ldXBsb2lkX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV9ldXBsb2lkKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfZXVwbG9pZF90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfZXVwbG9pZCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX2FuZXVwbG9pZF9yYXRlID0gbWVhbihhcy5udW1lcmljKHBndGFfYW5ldXBsb2lkKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfYW5ldXBsb2lkX3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9hbmV1cGxvaWQpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9hbmV1cGxvaWRfc2VnbWVudGFsX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV9hbmV1cGxvaWRfc2VnbWVudGFsKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfYW5ldXBsb2lkX3NlZ21lbnRhbF90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfYW5ldXBsb2lkX3NlZ21lbnRhbCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX3RyaXBsb2lkX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV90cmlwbG9pZCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX3RyaXBsb2lkX3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV90cmlwbG9pZCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX21vc2FpY19yYXRlID0gbWVhbihhcy5udW1lcmljKHBndGFfbW9zYWljKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbW9zYWljX3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9tb3NhaWMpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9tb3NhaWNfd2hvbGVfY2hyb21vc29tZV9yYXRlID0gbWVhbihhcy5udW1lcmljKHBndGFfbW9zYWljX3dob2xlX2Nocm9tb3NvbWUpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9tb3NhaWNfd2hvbGVfY2hyb21vc29tZV90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfbW9zYWljX3dob2xlX2Nocm9tb3NvbWUpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9tb3NhaWNfc2VnbWVudGFsX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV9tb3NhaWNfc2VnbWVudGFsKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbW9zYWljX3NlZ21lbnRhbF90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfbW9zYWljX3NlZ21lbnRhbCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX21vc2FpY19sb3dfcmF0ZSA9IG1lYW4oYXMubnVtZXJpYyhwZ3RhX21vc2FpY19sb3cpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9tb3NhaWNfbG93X3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9tb3NhaWNfbG93KSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbW9zYWljX2hpZ2hfcmF0ZSA9IG1lYW4oYXMubnVtZXJpYyhwZ3RhX21vc2FpY19oaWdoKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbW9zYWljX2hpZ2hfdG90YWwgPSBzdW0oYXMubnVtZXJpYyhwZ3RhX21vc2FpY19oaWdoKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbm9fZG5hX2RldGVjdGVkX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV9ub19kbmFfZGV0ZWN0ZWQpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9ub19kbmFfZGV0ZWN0ZWRfdG90YWwgPSBzdW0oYXMubnVtZXJpYyhwZ3RhX25vX2RuYV9kZXRlY3RlZCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX25vX3Jlc3VsdF9yYXRlID0gbWVhbihhcy5udW1lcmljKHBndGFfbm9fcmVzdWx0KSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbm9fcmVzdWx0X3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9ub19yZXN1bHQpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9jbGluaWNhbF9yZXN1bHRzX3VuZGV0ZXJtaW5lZF9yYXRlID0gbWVhbihhcy5udW1lcmljKHBndGFfY2xpbmljYWxfcmVzdWx0c191bmRldGVybWluZWQpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9jbGluaWNhbF9yZXN1bHRzX3VuZGV0ZXJtaW5lZF90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfY2xpbmljYWxfcmVzdWx0c191bmRldGVybWluZWQpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9pbmNvbmNsdXNpdmVfcmF0ZSA9IG1lYW4oYXMubnVtZXJpYyhwZ3RhX2luY29uY2x1c2l2ZSksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX2luY29uY2x1c2l2ZV90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfaW5jb25jbHVzaXZlKSwgbmEucm0gPSBUUlVFKSwKICAgIG4gPSBuKCkKICApCgoKCmdfYnhfZGF5IDwtIHJhdGVzX2J5X2J4X2RheSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcGF0aWVudF9hZ2VfeWVhcl9hdF9yZXRyaWV2YWwsIHkgPSBwZ3RhX2FuZXVwbG9pZF9yYXRlKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBieF9kYXkpLCBhbHBoYSA9IDAuNiwgc2hhcGUgPSAyMSwgc2l6ZSA9IDIuNSkgKwogIGdlb21fc21vb3RoKAogICAgbWV0aG9kID0gImdsbSIsCiAgICBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gImJpbm9taWFsIiksCiAgICBmb3JtdWxhID0geSB+IHNwbGluZXM6Om5zKHgsIGRmID0gOCksICMgZGY9OCBmb3IgbmF0dXJhbCBjdWJpYyBzcGxpbmUgd2l0aCA1IGludGVybmFsIGtub3RzCiAgICBhZXMod2VpZ2h0ID0gbiwgY29sb3IgPSBieF9kYXksIGZpbGwgPSBieF9kYXkpLCAjIE1hcCBjb2xvciBhbmQgZmlsbCB0byBieF9kYXkKICAgIHNlID0gVFJVRSwKICAgIGxldmVsID0gMC45NSwKICAgIGFscGhhID0gMC4xNSAjIEFkanVzdCBhbHBoYSBmb3IgQ0kgYmFuZCB0cmFuc3BhcmVuY3kgKDAuMCB0byAxLjApCiAgKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICBuYW1lID0gIkJpb3BzeSBEYXkiLCAKICAgIHZhbHVlcyA9IGMoIiNGOUUxNjgiLCAiIzkxYjc3NyIsICIjMzUzMTQ4IikgIyBZZWxsb3csIEdyZWVuLCBEYXJrIFB1cnBsZS9CbHVlCiAgKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICJCaW9wc3kgRGF5IiwgCiAgICB2YWx1ZXMgPSBjKCIjRjlFMTY4IiwgIiM5MWI3NzciLCAiIzM1MzE0OCIpICMgU2FtZSBjb2xvcnMgZm9yIGxpbmVzCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpICsKICBsYWJzKAogICAgdGl0bGUgPSAiS2luZExhYnMgQW5ldXBsb2lkeSBSYXRlIGJ5IEFnZSBhbmQgQmlvcHN5IERheSIsCiAgICBzdWJ0aXRsZSA9ICJGcmVzaCBhdXRvbG9nb3VzIElWRiBjeWNsZXMgaW4gS2luZEVNUiwgQXByaWwgMjAyMyB0byBKdWx5IDIwMjUiLAogICAgeCA9ICJQYXRpZW50IEFnZSBhdCBSZXRyaWV2YWwgKHllYXJzKSIsCiAgICB5ID0gIiIpCgoKZ19ieF9kYXkgJT4lIGFkZF9rYl9sb2dvKCkKYGBgCgpgYGB7cn0KIyBncmFwaCBubyBjYWxsIHJhdGVzIGJ5IGFnZSBhbmQgYnhfZGF5CmdfbnIgPC0gcmF0ZXNfYnlfYnhfZGF5ICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwYXRpZW50X2FnZV95ZWFyX2F0X3JldHJpZXZhbCwgeSA9IHBndGFfbm9fcmVzdWx0X3JhdGUpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IGJ4X2RheSksIGFscGhhID0gMC42LCBzaGFwZSA9IDIxLCBzaXplID0gMi41KSArCiAgZ2VvbV9zbW9vdGgoCiAgICBtZXRob2QgPSAiZ2xtIiwKICAgIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAiYmlub21pYWwiKSwKICAgIGZvcm11bGEgPSB5IH4gc3BsaW5lczo6bnMoeCwgZGYgPSA4KSwgIyBkZj04IGZvciBuYXR1cmFsIGN1YmljIHNwbGluZSB3aXRoIDUgaW50ZXJuYWwga25vdHMKICAgIGFlcyh3ZWlnaHQgPSBuLCBjb2xvciA9IGJ4X2RheSwgZmlsbCA9IGJ4X2RheSksICMgTWFwIGNvbG9yIGFuZCBmaWxsIHRvIGJ4X2RheQogICAgc2UgPSBUUlVFLAogICAgbGV2ZWwgPSAwLjk1LAogICAgYWxwaGEgPSAwLjE1ICMgQWRqdXN0IGFscGhhIGZvciBDSSBiYW5kIHRyYW5zcGFyZW5jeSAoMC4wIHRvIDEuMCkKICApICsKICBzY2FsZV9maWxsX21hbnVhbCgKICAgIG5hbWUgPSAiQmlvcHN5IERheSIsIAogICAgdmFsdWVzID0gYygiI0Y5RTE2OCIsICIjOTFiNzc3IiwgIiMzNTMxNDgiKSAjIFllbGxvdywgR3JlZW4sIERhcmsgUHVycGxlL0JsdWUKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICBuYW1lID0gIkJpb3BzeSBEYXkiLCAKICAgIHZhbHVlcyA9IGMoIiNGOUUxNjgiLCAiIzkxYjc3NyIsICIjMzUzMTQ4IikgIyBTYW1lIGNvbG9ycyBmb3IgbGluZXMKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCBicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSwgbGltaXRzID0gYygwLCAwLjA2KSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJLaW5kTGFicyBObyBSZXN1bHQgUmF0ZSBieSBBZ2UgYW5kIEJpb3BzeSBEYXkiLAogICAgc3VidGl0bGUgPSAiRnJlc2ggYXV0b2xvZ291cyBJVkYgY3ljbGVzIGluIEtpbmRFTVIsIEFwcmlsIDIwMjMgdG8gSnVseSAyMDI1IiwKICAgIHggPSAiUGF0aWVudCBBZ2UgYXQgUmV0cmlldmFsICh5ZWFycykiLAogICAgeSA9ICIiKQoKCmdfbnIgJT4lIGFkZF9rYl9sb2dvKCkKYGBgCgpObyBhcHBhcmVudCBlZmZlY3Qgb2YgYmlvcHN5IGRheSBvciBwYXRpZW50IGFnZSBvbiBubyBjYWxsIHJhdGUKCmBgYHtyfQojIHN0YWNrZWQgYmFyIGNoYXJ0IHdpdGggY291bnQgb2YgZW1icnlvcyBiaW9wc2llZCBieSBhZ2Ugd2l0aCBiYXJzIGNvbG9yZWQgYnkgYmlvcHN5IGRheQpnX2NvdW50X2J5X2J4X2RheSA8LSByYXRlc19ieV9ieF9kYXkgJT4lIAogIGdncGxvdChhZXMoeCA9IHBhdGllbnRfYWdlX3llYXJfYXRfcmV0cmlldmFsLCB5ID0gbiwgZmlsbCA9IGJ4X2RheSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJzdGFjayIsIGFscGhhID0gMC42KSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgc2l6ZSA9IDMuNSwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICBuYW1lID0gIkJpb3BzeSBEYXkiLCAKICAgIHZhbHVlcyA9IGMoIiNGOUUxNjgiLCAiIzkxYjc3NyIsICIjMzUzMTQ4IikgIyBZZWxsb3csIEdyZWVuLCBEYXJrIFB1cnBsZS9CbHVlCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNjYWxlczo6cHJldHR5X2JyZWFrcygpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNjYWxlczo6cHJldHR5X2JyZWFrcygpKSArCiAgbGFicygKICAgIHRpdGxlID0gIlRvdGFsIEVtYnJ5b3MgQmlvcHNpZWQgYnkgQWdlIGFuZCBCaW9wc3kgRGF5IiwKICAgIHN1YnRpdGxlID0gIkZyZXNoIGF1dG9sb2dvdXMgSVZGIGN5Y2xlcyBpbiBLaW5kRU1SLCBBcHJpbCAyMDIzIHRvIEp1bHkgMjAyNSIsCiAgICB4ID0gIlBhdGllbnQgQWdlIGF0IFJldHJpZXZhbCAoeWVhcnMpIiwKICAgIHkgPSAiQ291bnQgb2YgRW1icnlvcyIKICApCgoKZ19jb3VudF9ieV9ieF9kYXkgJT4lIGFkZF9rYl9sb2dvKCkKYGBgCgpgYGB7cn0KIyBtb3NhaWMgcmF0ZXMgYnkgZGF5Cm1vc2FpY19yYXRlc19ieV9ieF9kYXkgPC0ga2IgJT4lCiAgbXV0YXRlKHBhdGllbnRfYWdlX3llYXJfYXRfcmV0cmlldmFsID0gZmxvb3IocGF0aWVudF9hZ2VfYXRfcmV0cmlldmFsKSwKICAgICAgICAgYnhfZGF5ID0gZmFjdG9yKGJ4X2RheSkpICU+JQogIGZpbHRlcihwYXRpZW50X2FnZV95ZWFyX2F0X3JldHJpZXZhbCAlPiUgYmV0d2VlbigxNSwgNTApKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBndGFfbW9zYWljKSwgIWlzLm5hKGJ4X2RheSkpICU+JQogIGdyb3VwX2J5KGJ4X2RheSxwYXRpZW50X2FnZV95ZWFyX2F0X3JldHJpZXZhbCkgJT4lCiAgc3VtbWFyaXNlKAogICAgcGd0YV9ldXBsb2lkX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV9ldXBsb2lkKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfZXVwbG9pZF90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfZXVwbG9pZCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX2FuZXVwbG9pZF9yYXRlID0gbWVhbihhcy5udW1lcmljKHBndGFfYW5ldXBsb2lkKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfYW5ldXBsb2lkX3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9hbmV1cGxvaWQpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9hbmV1cGxvaWRfc2VnbWVudGFsX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV9hbmV1cGxvaWRfc2VnbWVudGFsKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfYW5ldXBsb2lkX3NlZ21lbnRhbF90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfYW5ldXBsb2lkX3NlZ21lbnRhbCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX3RyaXBsb2lkX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV90cmlwbG9pZCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX3RyaXBsb2lkX3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV90cmlwbG9pZCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX21vc2FpY19yYXRlID0gbWVhbihhcy5udW1lcmljKHBndGFfbW9zYWljKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbW9zYWljX3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9tb3NhaWMpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9tb3NhaWNfd2hvbGVfY2hyb21vc29tZV9yYXRlID0gbWVhbihhcy5udW1lcmljKHBndGFfbW9zYWljX3dob2xlX2Nocm9tb3NvbWUpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9tb3NhaWNfd2hvbGVfY2hyb21vc29tZV90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfbW9zYWljX3dob2xlX2Nocm9tb3NvbWUpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9tb3NhaWNfc2VnbWVudGFsX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV9tb3NhaWNfc2VnbWVudGFsKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbW9zYWljX3NlZ21lbnRhbF90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfbW9zYWljX3NlZ21lbnRhbCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX21vc2FpY19sb3dfcmF0ZSA9IG1lYW4oYXMubnVtZXJpYyhwZ3RhX21vc2FpY19sb3cpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9tb3NhaWNfbG93X3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9tb3NhaWNfbG93KSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbW9zYWljX2hpZ2hfcmF0ZSA9IG1lYW4oYXMubnVtZXJpYyhwZ3RhX21vc2FpY19oaWdoKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbW9zYWljX2hpZ2hfdG90YWwgPSBzdW0oYXMubnVtZXJpYyhwZ3RhX21vc2FpY19oaWdoKSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbm9fZG5hX2RldGVjdGVkX3JhdGUgPSBtZWFuKGFzLm51bWVyaWMocGd0YV9ub19kbmFfZGV0ZWN0ZWQpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9ub19kbmFfZGV0ZWN0ZWRfdG90YWwgPSBzdW0oYXMubnVtZXJpYyhwZ3RhX25vX2RuYV9kZXRlY3RlZCksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX25vX3Jlc3VsdF9yYXRlID0gbWVhbihhcy5udW1lcmljKHBndGFfbm9fcmVzdWx0KSwgbmEucm0gPSBUUlVFKSwKICAgIHBndGFfbm9fcmVzdWx0X3RvdGFsID0gc3VtKGFzLm51bWVyaWMocGd0YV9ub19yZXN1bHQpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9jbGluaWNhbF9yZXN1bHRzX3VuZGV0ZXJtaW5lZF9yYXRlID0gbWVhbihhcy5udW1lcmljKHBndGFfY2xpbmljYWxfcmVzdWx0c191bmRldGVybWluZWQpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9jbGluaWNhbF9yZXN1bHRzX3VuZGV0ZXJtaW5lZF90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfY2xpbmljYWxfcmVzdWx0c191bmRldGVybWluZWQpLCBuYS5ybSA9IFRSVUUpLAogICAgcGd0YV9pbmNvbmNsdXNpdmVfcmF0ZSA9IG1lYW4oYXMubnVtZXJpYyhwZ3RhX2luY29uY2x1c2l2ZSksIG5hLnJtID0gVFJVRSksCiAgICBwZ3RhX2luY29uY2x1c2l2ZV90b3RhbCA9IHN1bShhcy5udW1lcmljKHBndGFfaW5jb25jbHVzaXZlKSwgbmEucm0gPSBUUlVFKSwKICAgIG4gPSBuKCkKICApCgoKZ19tb3NfZGF5IDwtIG1vc2FpY19yYXRlc19ieV9ieF9kYXkgJT4lIAogIGdncGxvdChhZXMoeCA9IHBhdGllbnRfYWdlX3llYXJfYXRfcmV0cmlldmFsLCB5ID0gcGd0YV9tb3NhaWNfcmF0ZSkpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gYnhfZGF5KSwgYWxwaGEgPSAwLjYsIHNoYXBlID0gMjEsIHNpemUgPSAyLjUpICsKICBnZW9tX3Ntb290aCgKICAgIG1ldGhvZCA9ICJnbG0iLAogICAgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICJiaW5vbWlhbCIpLAogICAgZm9ybXVsYSA9IHkgfiBzcGxpbmVzOjpucyh4LCBkZiA9IDgpLCAjIGRmPTggZm9yIG5hdHVyYWwgY3ViaWMgc3BsaW5lIHdpdGggNSBpbnRlcm5hbCBrbm90cwogICAgYWVzKHdlaWdodCA9IG4sIGNvbG9yID0gYnhfZGF5LCBmaWxsID0gYnhfZGF5KSwgIyBNYXAgY29sb3IgYW5kIGZpbGwgdG8gYnhfZGF5CiAgICBzZSA9IFRSVUUsCiAgICBsZXZlbCA9IDAuOTUsCiAgICBhbHBoYSA9IDAuMTUgIyBBZGp1c3QgYWxwaGEgZm9yIENJIGJhbmQgdHJhbnNwYXJlbmN5ICgwLjAgdG8gMS4wKQogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgbmFtZSA9ICJCaW9wc3kgRGF5IiwgCiAgICB2YWx1ZXMgPSBjKCIjRjlFMTY4IiwgIiM5MWI3NzciLCAiIzM1MzE0OCIpICMgWWVsbG93LCBHcmVlbiwgRGFyayBQdXJwbGUvQmx1ZQogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIG5hbWUgPSAiQmlvcHN5IERheSIsIAogICAgdmFsdWVzID0gYygiI0Y5RTE2OCIsICIjOTFiNzc3IiwgIiMzNTMxNDgiKSAjIFNhbWUgY29sb3JzIGZvciBsaW5lcwogICkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIGJyZWFrcyA9IHNjYWxlczo6cHJldHR5X2JyZWFrcygpLCBsaW1pdHMgPSBjKDAsIDAuMDYpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNjYWxlczo6cHJldHR5X2JyZWFrcygpKSArCiAgbGFicygKICAgIHRpdGxlID0gIktpbmRMYWJzIE1vc2FpYyBSYXRlIGJ5IEFnZSBhbmQgQmlvcHN5IERheSIsCiAgICBzdWJ0aXRsZSA9ICJGcmVzaCBhdXRvbG9nb3VzIElWRiBjeWNsZXMgaW4gS2luZEVNUiwgQXByaWwgMjAyMyB0byBKdWx5IDIwMjUiLAogICAgeCA9ICJQYXRpZW50IEFnZSBhdCBSZXRyaWV2YWwgKHllYXJzKSIsCiAgICB5ID0gIiIpCgpnX21vc19kYXkgJT4lIGFkZF9rYl9sb2dvKCkKYGBgCgpgYGB7cn0KZ19tb3MgPC0gcmF0ZXNfYnlfYWdlICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwYXRpZW50X2FnZV95ZWFyX2F0X3JldHJpZXZhbCwgeSA9IHBndGFfbW9zYWljX3JhdGUpKSArCiAgZ2VvbV9zbW9vdGggKAogICAgbWV0aG9kID0gImdsbSIsCiAgICBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gImJpbm9taWFsIiksCiAgICBmb3JtdWxhID0geSB+IHNwbGluZXM6Om5zKHgsIDgpLCAjIDUga25vdHMKICAgIGFlcyh3ZWlnaHQgPSBuKSwKICAgIHNlID0gVFJVRSwKICAgIGxldmVsID0gMC45NSwKICAgIGNvbG9yID0gIiNGOUUxNjgiLAogICAgZmlsbCA9ICIjRjNFN0RBIgogICkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjYsIGNvbG9yID0gIiMzNTMxNDgiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpICsKICBsYWJzKAogICAgdGl0bGUgPSAiS2luZExhYnMgTW9zYWljIFJhdGUgYnkgQWdlIiwKICAgIHN1YnRpdGxlID0gIkZyZXNoIGF1dG9sb2dvdXMgSVZGIGN5Y2xlcyBpbiBLaW5kRU1SLCBBcHJpbCAyMDIzIHRvIEp1bHkgMjAyNSIsCiAgICB4ID0gIlBhdGllbnQgQWdlIGF0IFJldHJpZXZhbCAoeWVhcnMpIiwKICAgIHkgPSAiIiwKICAgIGNhcHRpb24gPSBnbHVlOjpnbHVlKHJhdGVzX2J5X2FnZV9uJG4sICIgdHJvcGhlY3RvZGVybSBiaW9wc2llcywgIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICByYXRlc19ieV9hZ2VfbiRkaXN0aW5jdF9hdHRlbXB0cywgIiBmcmVzaCBhdXRvbG9nb3VzIElWRiBjeWNsZXMsICIsCiAgICAgICAgICAgICAgICAgICAgICAgICByYXRlc19ieV9hZ2VfbiRkaXN0aW5jdF9wYXRpZW50cywgIiBwYXRpZW50cyIpKQoKYWRkX2tiX2xvZ28oZ19tb3MpCmBgYAoKYGBge3J9CmdfbW9zX2hpZ2ggPC0gcmF0ZXNfYnlfYWdlICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwYXRpZW50X2FnZV95ZWFyX2F0X3JldHJpZXZhbCwgeSA9IHBndGFfbW9zYWljX2hpZ2hfcmF0ZSkpICsKICBnZW9tX3Ntb290aCAoCiAgICBtZXRob2QgPSAiZ2xtIiwKICAgIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAiYmlub21pYWwiKSwKICAgIGZvcm11bGEgPSB5IH4gc3BsaW5lczo6bnMoeCwgOCksICMgNSBrbm90cwogICAgYWVzKHdlaWdodCA9IG4pLAogICAgc2UgPSBUUlVFLAogICAgbGV2ZWwgPSAwLjk1LAogICAgY29sb3IgPSAiI0Y5RTE2OCIsCiAgICBmaWxsID0gIiNGM0U3REEiCiAgKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNiwgY29sb3IgPSAiIzM1MzE0OCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCBicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJLaW5kTGFicyBSYXRlIG9mIEhpZ2gtbGV2ZWwgTW9zYWljcyBvZiBhbGwgTW9zYWljcywgYnkgQWdlIiwKICAgIHN1YnRpdGxlID0gIkZyZXNoIGF1dG9sb2dvdXMgSVZGIGN5Y2xlcyBpbiBLaW5kRU1SLCBBcHJpbCAyMDIzIHRvIEp1bHkgMjAyNSIsCiAgICB4ID0gIlBhdGllbnQgQWdlIGF0IFJldHJpZXZhbCAoeWVhcnMpIiwKICAgIHkgPSAiIiwKICAgIGNhcHRpb24gPSBnbHVlOjpnbHVlKHJhdGVzX2J5X2FnZV9uJG4sICIgdHJvcGhlY3RvZGVybSBiaW9wc2llcywgIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICByYXRlc19ieV9hZ2VfbiRkaXN0aW5jdF9hdHRlbXB0cywgIiBmcmVzaCBhdXRvbG9nb3VzIElWRiBjeWNsZXMsICIsCiAgICAgICAgICAgICAgICAgICAgICAgICByYXRlc19ieV9hZ2VfbiRkaXN0aW5jdF9wYXRpZW50cywgIiBwYXRpZW50cyIpKQogICAgIyBjYXB0aW9uID0gIjxicj5Nb3NhaWMgcmF0ZSBpcyAlIG9mIGVtYnJ5b3Mgd2l0aCB0aGUgUEdULUEgcmVzdWx0IFwibW9zYWljXCIgcmVwb3J0ZWQsIHdoZXRoZXIgPGJyPgogICAgIyBoaWdoLSBvciBsb3ctbGV2ZWwuIFRoaXMgZXhjbHVkZXMgZW1icnlvcyB3aGVyZSBhbmV1cGxvaWQgYW5kIG1vc2FpYyByZXN1bHRzIHdlcmUgPGJyPgogICAgIyByZXBvcnRlZCBmb3IgdGhlIHNhbWUgZW1icnlvLCB3aGVyZSB0aGUgZmluYWwgcmVzdWx0IHdvdWxkIGJlIFwiYW5ldXBsb2lkXCIuPC9wPiIKICAjICkgKyAKICAjIHRoZW1lKAogICMgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X21hcmtkb3duKGhqdXN0ID0gMCkKICAjICAgcGxvdC5jYXB0aW9uLnBvc2l0aW9uCiAgIyApCgphZGRfa2JfbG9nbyhnX21vc19oaWdoKQpgYGA=